package com.john.elasticsearch.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.john.elasticsearch.common.SearchAfterResult;
import com.john.utils.page.PageInfoUtils;

public interface ESClientService<T> {
    /**
     * 创建索引
     * @param indexName 索引名称
     * @return
     */
    boolean createIndex(String indexName);

    /**
     * 查询索引是否存在
     * @param indexName 索引名称
     * @return
     */
    boolean existIndex(String indexName);

    /**
     * 删除索引
     * @param indexName 索引名称
     * @return
     */
    boolean removeIndex(String indexName);

    /**
     * 批量插入数据到ES搜索引擎
     * @param indexName
     * @param source JSONArray中每一个JSONObject必须包含key indexDataId 属性，且值必须是唯一的
     */
    void insertDocumentTOES(String indexName, JSONArray source);

    /**
     * 批量插入数据到ES搜索引擎
     * @param indexName
     * @param source JSONObject必须包含key indexDataId 属性，且值必须是唯一的
     */
    void insertDocumentTOESOne(String indexName, JSONObject source);

    /**
     * 使用IK分词器分词
     * @param content 代分词内容
     * @param analyzer 分词类型 选值范围：ik_max_word 精确分词  ik_smart 大致分词
     *                 默认选值 ik_max_word
     * @return
     */
    String queryAnalyze(String content,String analyzer);

    /**
     * 根据数据索引Id查询数据
     * @param indexName 索引名称
     * @param indexId 索引数据ID
     * @return
     */
    String queryById(String indexName,String indexId);

    /**
     * 根据数据索引ID修改索引数据
     * @param object 修改数据对象 如属性值不为空则修改
     * @param indexName 索引名称
     * @param indexId 索引数据ID
     */
    void updateById(Object object, String indexName, String indexId);

    /**
     * 根据数据索引ID删除数据
     * @param indexName 索引名称
     * @param indexId 索引数据ID
     */
    void removeById(String indexName,String indexId);

    /**
     * 分页查询搜索引擎
     * @param indexName 索引
     * @param t 实体参数对象
     * @param pageInfoUtils 分页对象
     * from + size 分页查询
     * es对from + size 是有限制的 from+size二者之和超过10000会报错
     */
    JSONArray queryPage(String indexName,T t,PageInfoUtils pageInfoUtils);

    /**
     * searchAfter分页查询
     * @param indexName 索引
     * @param t 实体参数对象
     * @param searchAfterResult 交替结果集
     * @return
     */
    JSONArray queryAfterPage(String indexName, T t, SearchAfterResult searchAfterResult);

}
